import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
import { message } from "antd";

interface ResponseData<T> {
  code: number;
  data: T;
  message: string;
}

const request = axios.create({
  // 当axios发送请求时,要求传递url地址,url地址可以写绝对路径以及相对路径.当写相对路径时,baseURL的字符串就会拼接在具体发请求的路径前面

  // process.env.REACT_APP_API 这段代码被webpack编译之后,返回的其实就是一个字符串
  // 执行了npm start的时候,就会加载.env.development文件 process.xxx.xxx 返回的就是'/dev-api'
  // 执行了npm run build的时候,机会加载 .env.production文件, process.xxx.xxx 返回的就是'/prod-api'
  baseURL: process.env.REACT_APP_API, // process是node里面的一个进程对象
  timeout: 10000,
  headers: {},
});

// 请求拦截器函数：发送请求之前触发的函数
request.interceptors.request.use((config: AxiosRequestConfig) => {
  const token = localStorage.getItem("token");
  // 携带token
  if (token) {
    (config.headers as any).token = token;
  }
  return config;
});

// 响应拦截器函数：得到响应之后触发的函数
request.interceptors.response.use(
  (response: AxiosResponse<ResponseData<any>>) => {
    if (response.data.code === 200) {
      return response.data.data;
    } else {
      message.error(response.data.message);
      return Promise.reject(response.data.message);
    }
  },
  (error) => {
    message.error(error);
    return Promise.reject(error);
  }
);

export default request;
